"""
    harris检测
        cv.cornerHarris(src, blockSize, ksize, k)
            参数：
                img:数据类型为float32的输入图像。
                blockSize:角点检测中要考虑的领域大小，
                ksize：sobel求导使用的核大小
                k:角点检测方程中的自由参数，取值参数为[0.04, 0.06]
"""
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 1. 读取图像，并转换成灰度图像
img = cv.imread("image/chessboard.jpg")
gray = cv.cvtColor(img, cv.COLOR_BGRA2GRAY)

# 2. 角点检测
# 2.1 输入图像必须是float32
gray = np.float32(gray)

# 2.2 最后一个参数在 0.04 和 0.05 之间
dst = cv.cornerHarris(gray, 2, 3, 0.04)

# 3. 设置阈值，将角点绘制出来，阈值根据图像进行选择
img[dst > 0.001 * dst.max()] = [0, 0, 255]

# 4. 图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.imshow(img[:, :, ::-1]), plt.title("Harris角点检测")
plt.xticks([]), plt.yticks([])
plt.show()
